package com.ddyx.util;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.DateConverter;
/**
 * @author liuhoujie
 * @DESC map转pojo工具类
 * @param bean
 * @param properties
 */
public final class MyBeanUtils {
	private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	
	private MyBeanUtils() {
	}

	/**
	 * @author liuhoujie
	 * @DESC beanutils工具(加时间格式处理)
	 * @param bean
	 * @param properties
	 */
	public static void populate(Object pojo, Map<String, Object> properties) {
		 try {
			 
		        //处理时间格式
		        DateConverter dateConverter = new DateConverter(null);
		        //设置日期格式
		        dateConverter.setPatterns(new String[]{"yyyy-MM-dd","yyyy-MM-dd HH:mm:ss","yyyy-MM-dd HH:mm"});
		        //注册格式
		        ConvertUtils.register(dateConverter, Date.class);
		        // 注册String->decimal
				//StringConverter stringConverter = new StringConverter(null);
				//ConvertUtils.register(stringConverter, BigDecimal.class);
		        //封装数据
		        BeanUtils.populate(pojo, properties);
		    } catch (IllegalAccessException | InvocationTargetException e) {
		        throw new RuntimeException(e);
		    }
	}
	
	
	/**
	 * @author liuhoujie
	 * @DESC 自定义map转pojo工具(加时间格式处理)
	 * @param bean
	 * @param properties
	 */
	@SuppressWarnings("unused")
	public static void populateIgnoreCase(Object pojo, Map<String, Object> map) {
		/* 获取pojo的类型clazz */
		Class<? extends Object> clazz = pojo.getClass();
		/* 获取pojo的内部方法 */
		Field[] fields = clazz.getDeclaredFields();
		/* 私有方法授权 */
		Field.setAccessible(fields, true);
		try {
			/* 循环遍历map */
			for (Map.Entry<String, Object> entry : map.entrySet()) {
				/* map循环当前获取到当前的key */
				String key = entry.getKey();
				/* map循环当前获取到当前的value */
				Object value = entry.getValue();
				/* 循环遍历pojo字段的名和值 */
				for (Field field : fields) {
					String name = field.getName();
					if (name.equalsIgnoreCase(key)) {
						/*判断时间的格式是否为时间戳*/
						if (name.toUpperCase().contains("TIME") && (value + "").matches("\\d+")) {
							field.set(pojo, format.parse(format.format(value)));
						} else {
							field.set(pojo, value);
						}
						/* 如果找到对应字段结束循环,提高效率 */
						break;						
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
}
